﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DimsMapper.Modules;

namespace DimsMapper.UIClasses
{
    public class MapTab
    {
        public delegate void RedrawHandler();
        public event RedrawHandler MapRedraw;

        public delegate void MapChangeHandler(bool state);
        public event MapChangeHandler MapChange;

        Minimap miniMap;

        private string mapCurentSavePath;
        private bool mapChanced; // флаг не сохраненной карты

        internal Map editedMap;
        internal int currentLevel = 1; // текуший редактируемый уровень

        // Текущий размер окна просмотра карты
        internal static int cMapViewPortW;
        internal static int cMapViewPortH;

        internal static int mouseX;
        internal static int mouseY;
        internal static int startSelectMouseX;
        internal static int startSelectMouseY;

        internal static int startSelectTileX;
        internal static int startSelectTileY;
        internal static int endSelectTileX;
        internal static int endSelectTileY;
        internal static int selectedTileRegion; // 1 - down, 2/3 - has select

        internal bool mouseOverMap = false;

        // Текущая позиция карты
        internal int cWorldX = 3300;
        internal int cWorldY = 1400;

                                    // item  crit  snen  tile  wall  misc  roof   hex    block   
        private bool[] showObjects = { true, true, true, true, true, true, false, false, false, false, false };

        internal int pickObjectPid = -1;
        internal int placementObjX;
        internal int placementObjY;

        internal bool selectedObjectMode = false;
        internal bool moveObjectMode = false;

        public MapTab(Map map, string path)
        {
            editedMap = map;
            mapCurentSavePath = path;
            miniMap = new Minimap(map.Levels);
        }

        public void MapChangeState(bool state)
        {
            mapChanced = state;
            MapChange.Invoke(state);
        }

        public void MapSave()
        {
            if (mapCurentSavePath == null) {
                mapCurentSavePath = Path.Combine(Settings.SaveDataFolder, "MAPS", editedMap.MapName);
            } 

            FileStream file = File.Open(mapCurentSavePath + "_dims.map", FileMode.Create, FileAccess.Write, FileShare.None);

            editedMap.Save(file);
            file.Close();
        }

        public bool MapClose()
        {
            if (!mapChanced) return false; // закрываем

            DialogResult result = MessageBox.Show("Карта не сохранена. Сохранить перед закрытием?", Application.ProductName, MessageBoxButtons.YesNoCancel);
            if (result == DialogResult.Yes) MapSave();

            return result == DialogResult.Cancel; // true - прервать закрытие
        }

        internal Minimap MiniMap
        {
            get { return miniMap; }
        }

        public string MapName()
        {
            return editedMap.MapName;
        }

        public string MapFile()
        {
            return mapCurentSavePath;
        }

        public bool SetMapFile(string file)
        {
            string name = Path.GetFileName(file);
            if (name.Length >= 16) {
                MessageBox.Show("Имя файла карты слишком длинное.\nИмя должно быть не длинее 12 символов.", Application.ProductName);
                return false;
            }
            mapCurentSavePath = file;
            editedMap.MapName = name;
            return true;
        }

        public void StartupViewportPosition()
        {
            int tileX, tileY;
            Utilites.GetHexXY(editedMap.PlayerStartTile, out tileX, out tileY); // x/y координаты гекса 
            Utilites.GetHexWorldCoord(tileX, tileY, out cWorldX, out cWorldY);  // коодинаты на карте

            cWorldX -= (cMapViewPortW / 2);
            cWorldY -= (cMapViewPortH / 2);
            MapRedraw.Invoke();
        }

        public void MapUpdate()
        {
            MapRedraw.Invoke();
        }

        public void SetShowObjects(int n, bool state)
        {
            showObjects[n] = state;
            MapRedraw.Invoke();
        }

        internal bool ShowObjects(Main.ShowTypes n)
        {
            return showObjects[(int)n];
        }

        internal void ClearSelectedObjects()
        {
            editedMap.Objects.ClearSelectedObject();
        }
    }
}
